//导入jwt包
const jwt = require('jsonwebtoken')
const { JWT_SECRET } = process.env

const {
  tokenExpiredError,
  invalidToken,
  notToken,
  hasNotAdminPermission
} = require('../constant/err.type')

//验证token方法
const auth = async (ctx, next) => {
  const { authorization } = ctx.request.header
  //注意这里Bearer后面有一个空格
  if (authorization) {
    const token = authorization.replace('Bearer ', '')
    
  try {
    //user中包含payload的信息(id,usename,is_admin)
    const user = jwt.verify(token, JWT_SECRET)
    ctx.state.user = user
  } catch (err) {
    switch (err.name) {
      case 'TokenExpiredError':
        console.error('token以过期', err)
        return ctx.app.emit('error', tokenExpiredError, ctx)
      case 'JsonWebTokenError':
        console.error('无效的token')
        return ctx.app.emit('error', invalidToken, ctx)
    }
  }

  } else {
    console.error('登录凭证不存在')
    return ctx.app.emit('error', notToken, ctx)
  }




  await next()
}

//判断是否有管理员权限
const hadAdminPermission = async (ctx, next) => {

  //验证通过后，用户数据存在user中，可以从中解构
  const { is_admin } = ctx.state.user

  //console.log(ctx.state.user)

  if (!is_admin) {
    console.error('该用户没有管理员的权限！')
    return ctx.app.emit('error', hasNotAdminPermission, ctx)
  }

  await next()
}

module.exports = {
  auth,
  hadAdminPermission
}
